package com.ajavaer.framework.handle;

import com.ajavaer.framework.cache.type.CacheItem;
import com.ajavaer.framework.config.CacheEngineConfig;
import org.springframework.context.ApplicationContext;

import java.util.concurrent.TimeUnit;
import java.util.function.Function;

/**
 * 缓存句柄
 *
 * @param <K>
 * @param <T>
 */
public interface CacheHandle<K, T> {

    /**
     * 初始化
     */
    void init(CacheEngineConfig cacheEngineConfig, ApplicationContext contextAware);

    /**
     * 新增缓存
     *
     * @param key
     * @param value
     */
    default void put(K key, T value) {
        put(key, value, -1, TimeUnit.SECONDS);
    }

    /**
     * 新增缓存
     *
     * @param key
     * @param value
     * @param expire
     * @param timeUnit
     */
    void put(K key, T value, Integer expire, TimeUnit timeUnit);

    /**
     * 新增缓存
     *
     * @param key
     * @param value
     * @param expire 过期时间,单位:秒
     */
    default void put(K key, T value, Integer expire) {
        put(key, value, expire, TimeUnit.SECONDS);
    }

    /**
     * 假设缓存对象存在,获取缓存对象
     *
     * @param key
     * @return
     */
    default T getIfPresent(K key) {
        return get(key, k -> CacheItem.of(key, null));
    }

    /**
     * 获取缓存对象
     *
     * @param key
     * @param create
     * @return
     */
    T get(K key, Function<K, CacheItem<K, T>> create);

    default int size() {
        return 0;
    }


    /**
     * 指定键是否存在
     *
     * @param key
     * @return
     */
    default boolean exists(K key) {
        return getIfPresent(key) != null;
    }

    /**
     * 删除指定缓存
     *
     * @param key
     */
    void delete(K key);

    /**
     * 清空缓存
     */
    default void clear() {
    }

    /**
     * 释放缓存
     */
    default void destroy() {
    }

}
